iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
Modern Web

重新認識 FrontEnd系列 第 23

Day23:事件循環 Event loop

  • 分享至 

  • xImage
  •  

JavaScript 運行流程

當在 JavaScript 運行時,其為單線程的運行,也就是所謂的一次只處理一件事,當一件事情完成後再去任務堆疊裡面執行下一個任務,但其本身支援建立非同步請求,讓我們運行了一個請求後,將所要求的任務加入到任務佇列,直到所有主任務執行完後才會開始從任務佇列拉取任務,具體順序為

  1. 執行任務堆疊裡面的任務直到結束
  2. 檢查任務堆疊是否為空,若為空則執行任務佇列內的任務

任務佇列種類

而在任務佇列中,有著宏任務(macro task)跟微任務(micro task)的差別,微任務的執行優先度會高於宏任務,兩者的任務大概種類如下

  1. 宏任務:setTimeout, setInterval, I/O 等等
  2. 微任務:Promise callback, process.nextTick(nodeJS)

兩者混合後的內容會變成是

  1. 執行任務堆疊裡面的任務直到結束
  2. 檢查任務堆疊是否為空,若為空則開始執行微任務
  3. 檢查任務堆疊、微任務佇列是否為空,若為空則開始執行宏任務

特殊案例

上面有提到,setTimeout 的任務會晚於主任務執行,因此哪怕我們的延遲時間為 0,也會在主任務完全執行完後才執行 setTimeout 的任務

console.log('start', Date.now())
setTimeout(() => {console.log('macro task', Date.now())}, 0)
let now = Date.now()
while(Date.now() - now < 1000){}
console.log('end', Date.now())

執行結果為

  1. start 1724833677758
  2. end 1724833678762
  3. macro task 1724833678765

上一篇
Day22:ES2022、ES2023
下一篇
Day24:為何需要 TypeScript
系列文
重新認識 FrontEnd30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言